package baseObject;

public interface IBrickBreaker extends IBrickBreakerObservable {
	//TODO: À virer... puisque le XMAX et YMAX est passé en paramètre du init
	final int XMAX = 500;
	final int YMAX = 500;
	
	/**
	 * Initialiseur d'un objet BrickBreaker
	 * @param xMax
	 * @param yMax
	 */
	void init(int xMax, int yMax);
	
	/**
	 * Type énuméré qui permet de définir l'état de la partie
	 * @author dorian
	 *
	 */
	enum TFinished {NO,WIN,GAMEOVER};
	
	/**
	 * Type énuméré permettant de définir le sens de déplacement du paddle.
	 * @author dorian
	 *
	 */
	enum TMove {NONE,LEFT,RIGHT};
	
	/**
	 * Accesseur vers le xMax
	 * @return le XMAX
	 */
	int getXMAX();
	
	/**
	 * Accesseur vers le yMax
	 * @return
	 */
	int getYMAX();
	
	/**
	 * Retourne l'état de la partie
	 * @return : état de la partie
	 */
	TFinished isFinished();
	
	/**
	 * Retourne la direction du paddle
	 * @return
	 */
	TMove getPlayerDirection();
	
	/**
	 * Modifie la direction du paddle
	 */
	//TODO: ajouter au specif
	void setPlayerDirection(TMove direction);
	
	/**
	 * Retourne la raquette
	 * @return : le paddle
	 */
	IPaddle getPaddle();
	
	/**
	 * Retourne le mur
	 * @return
	 */
	IWall getWall();
	
	/**
	 * Retourne la balle du breakout
	 * @return : une balle
	 */
	IBall getBall();
	
	/**
	 * Calcul le pas du jeu : déplace le paddle, la balle, gère les collisions...
	 */
	void calculateStep();
	
	/**
	 * Déplace le Paddle dans la 
	 * @param tMove
	 */
	void movePaddle(TMove tMove);
	void moveBall();
	void initLevelOne();
}
